/**
 * @author  Thomas Lehmann
 * @file    Comments.js
 *
 * Copyright (c) 2013 Thomas Lehmann
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
 * documentation files (the "Software"), to deal in the Software without restriction, including without limitation
 * the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software,
 * and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all copies
 * or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
 * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
 * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
 * DAMAGES OR OTHER LIABILITY,
 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */
var log;
var Class;
var Factory;

if (typeof require == 'function') {
    var ClassTools = require("./ClassTools.js");
    log         = ClassTools.log;
    Class       = ClassTools.Class;
    Factory     = ClassTools.Factory;
}

var CppComments = Class({
    initialize: function() {
        this.lineComment = "//";
        this.blockCommentStart = "/*";
        this.blockCommentEnd = "*/";
    }
});

var PythonComments = Class({
    initialize: function() {
        this.lineComment = "#";
        this.blockCommentStart = "\"\"\"";
        this.blockCommentEnd = "\"\"\"";
    }
});

var PascalComments = Class({
    initialize: function() {
        this.lineComment = "//";
        this.blockCommentStart = "{";
        this.blockCommentEnd = "}";
    }
});

var BasicComments = Class({
    initialize: function() {
        this.lineComment = "'";
        this.blockCommentStart = "/'";
        this.blockCommentEnd = "'/";
    }
});

var RubyComments = Class({
    initialize: function() {
        this.lineComment = "#";
        this.blockCommentStart = "=begin";
        this.blockCommentEnd = "=end";
    }
});

var PerlComments = Class({
    initialize: function() {
        this.lineComment = "#";
        this.blockCommentStart = "=begin";
        this.blockCommentEnd = "=end";
    }
});

var BatchComments = Class({
    initialize: function() {
        this.lineComment = "rem";
        this.blockCommentStart = "";
        this.blockCommentEnd = "";
    }
});

var CommentFactory = new Factory();
CommentFactory.register("default"   , CppComments);
CommentFactory.register("c++"       , CppComments);
CommentFactory.register("d"         , CppComments);
CommentFactory.register("pascal"    , PascalComments);
CommentFactory.register("python"    , PythonComments);
CommentFactory.register("javascript", CppComments);
CommentFactory.register("java"      , CppComments);
CommentFactory.register("php"       , CppComments);
CommentFactory.register("c#"        , CppComments);
CommentFactory.register("groovy"    , CppComments);
CommentFactory.register("scala"     , CppComments);
CommentFactory.register("basic"     , BasicComments);
CommentFactory.register("ruby"      , RubyComments);
CommentFactory.register("perl"      , PerlComments);
CommentFactory.register("batch"     , BatchComments);

if (typeof(exports) != 'undefined') {
    exports.CommentFactory = CommentFactory;
}
